package controller;

import helper.AbstractAction;

import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import view.BankView;
import bank.Kunde;

public class BankViewController {

	private BankView bankView;
	private BankHandler bankHandler;
    private AnlegenKundenDialogController anlegenKundenDialogController;
    private AnlegenKontoDialogController anlegenKontoDialogController;
    private EinAuszahlenDialogController einAuszahlenDialogController;
    private UeberweisungDurchfuehrenDialogController ueberweisungDurchfuehrenDialogController;
    private KontoUebersichtDialogController kontoUebersichtDialogController;
    private KontobewegungenDialogController kontobewegungenDialogController;

	public BankViewController() {
	}

	public void startBankView(BankHandler aBankHandler) {
		bankHandler = aBankHandler;
		bankView = new BankView();
        anlegenKundenDialogController = new AnlegenKundenDialogController(bankHandler, bankView);
        anlegenKontoDialogController = new AnlegenKontoDialogController(bankHandler, bankView);
        einAuszahlenDialogController = new EinAuszahlenDialogController(bankHandler, bankView);
        ueberweisungDurchfuehrenDialogController = new UeberweisungDurchfuehrenDialogController(bankHandler, bankView);
        kontoUebersichtDialogController = new KontoUebersichtDialogController(bankHandler, bankView);
        kontobewegungenDialogController = new KontobewegungenDialogController(bankHandler, bankView);

		bankView.getAnlegenKunde().addActionListener(new AnlegenKundenAction());
		bankView.getDurchfuehrenZahlungen().addActionListener(new EinAuszahlenAction());
		bankView.getAnlegenKonto().addActionListener(new AnlegenKontoAction());
		bankView.getDurchfuehrenUeberweisungen().addActionListener(new UeberweisungAction());
        bankView.getAnzeigenKontostand().addActionListener(new AnzeigenKontostandAction());
        bankView.getAnzeigenKontobewegungen().addActionListener(new AnzeigenKontobewegungenAction());
		bankView.getEnde().addActionListener(new EndeAction());
		bankView.getKundenTable().addMouseListener(new KundenDoubleClickListener());

		bankHandler.addPropertyChangeListener(BankHandler.PROPERTYNAME_KUNDEN, new KundenTableSynchronizer());
		synchronizeKundenUebersicht();

		bankView.setVisible(true);
	}

	private void synchronizeKundenUebersicht() {
        bankView.getKundenUebersichtTableModel().setKunden(bankHandler.getKundenListe());
	}


	// Inner Classes ***********************************************************

	private class AnlegenKontoAction extends AbstractAction {
		@Override
		protected void execute(ActionEvent aEvent) throws Exception {
            anlegenKontoDialogController.start();
        }
	}

	private class AnlegenKundenAction extends AbstractAction {
		@Override
		protected void execute(ActionEvent aEvent) throws Exception {
            anlegenKundenDialogController.start();
        }
	}

    private class EinAuszahlenAction extends AbstractAction {
		@Override
		protected void execute(ActionEvent aEvent) throws Exception {
            einAuszahlenDialogController.start();
        }
    }

    private class UeberweisungAction extends AbstractAction {
        @Override
        protected void execute(ActionEvent aEvent) throws Exception {
            ueberweisungDurchfuehrenDialogController.start();
        }
    }

    private class AnzeigenKontostandAction extends AbstractAction {
        @Override
        protected void execute(ActionEvent aEvent) throws Exception {
            kontoUebersichtDialogController.start();
        }
    }

    private class AnzeigenKontobewegungenAction extends AbstractAction {
        @Override
        protected void execute(ActionEvent aEvent) throws Exception {
            kontobewegungenDialogController.start();
        }
    }

    private class EndeAction extends AbstractAction {
        @Override
        protected void execute(ActionEvent aEvent) throws Exception {
            bankView.dispose();
        }
    }

    private class KundenTableSynchronizer implements PropertyChangeListener {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            synchronizeKundenUebersicht();
        }
    }

    private class KundenDoubleClickListener implements MouseListener {

        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 2) {
                int selectedIndex = bankView.getKundenTable().getSelectedRow();
                Kunde selectedKunde = bankView.getKundenUebersichtTableModel().getKunden().get(selectedIndex);
                kontobewegungenDialogController.start(selectedKunde.getKundennummer());
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }
    }
}
